package org.bigjava.novelplatform.service;

import org.bigjava.novelplatform.common.constant.ComplexConstant;
import org.bigjava.novelplatform.common.enums.ActionType;
import org.bigjava.novelplatform.entity.Browsing;
import org.bigjava.novelplatform.entity.ChapterSays;
import org.bigjava.novelplatform.entity.Users;
import org.bigjava.novelplatform.vo.BookRackItemVo;
import org.bigjava.novelplatform.vo.SimpleBookRackVo;
import org.bigjava.novelplatform.vo.UserInfoVo;
import org.bigjava.novelplatform.vo.UserInquireVo;

import java.util.List;
import java.util.function.Supplier;

/**
 * @author ykh
 * @create 2022-04-04 8:48
 */
public interface UserService {
    /**
     * 注册
     * @param user
     * @return
     */
    UserInfoVo register(Users user);

    /**
     * 重置密码
     * @param userId
     * @param newPassword
     * @param authCode
     * @return
     */
    Users resetPasswords(Integer userId, String newPassword, String authCode);

    /**
     * 读取{@link ComplexConstant} ReadFileName并发送验证邮箱
     * 注意该方法没有验证email的有效行
     * @param email             收件人邮箱
     * @param getRandomString   生成随机函数
     * @param ReadFileName      读取文件名
     * @return
     */
    boolean sendMailVerification(String email, Supplier<String> getRandomString, String ReadFileName);

    /**
     * 向用户邮箱发送重置密码的验证码
     * @param id
     * @return
     */
    boolean sendMailResetPasswords(Integer id);

    /**
     * 发送注册的验证码
     * @param email
     * @return
     */
    boolean sendMailRegister(String email);

    /**
     * 登录
     * @param user
     * @return
     */
    UserInfoVo login(Users user);

    /**
     * 查询用户书架上的书籍
     * @param userId
     * @param group
     * @return
     */
    List<BookRackItemVo> selectBookRackByUserId(Integer userId, String group);

    /**
     * 书架新增书籍
     * 当新增书籍含有用户不存在的分组时，相当与插入了新的分组
     *
     * @param userId
     * @param group
     * @param bookIdList
     */
    void addBookRack(Integer userId,String group ,List<Integer> bookIdList);

    /**
     * 将一本书添加书架
     * @param userId
     * @param group
     * @param bookId
     * @return
     */
    boolean updateBookRack(Integer userId,String group ,Integer bookId);

    /**
     * 从书架中移除书籍
     * @param userId
     * @param bookIdList
     */
    void removeBookRack(Integer userId, List<Integer> bookIdList);

    /**
     * 将书籍从一个分组移至另一个分组
     * @param userId
     * @param oldGroup
     * @param targetGroup
     * @param bookIdList
     */
    void moveBookRack(Integer userId, String oldGroup, String targetGroup, List<Integer> bookIdList);

    /**
     * 将书籍置顶
     * 容易混淆，弃用
     * @param userId
     * @param bookId
     */
    @Deprecated
    void topping(Integer userId, Integer bookId);

    /**
     * 根据在bookIdList的顺序设置sort属性
     * @param userId
     * @param group
     * @param bookIdList
     */
    void bookSort(Integer userId, String group, List<Integer> bookIdList);

    /**
     * 查询用户邮箱
     * @param id
     * @return
     */
    String selectUserEmailById(Integer id);

    /**
     * 成为作者
     * @param id
     */
    void becomeAnAuthor(Integer id);

    /**
     * 修改订阅状态
     * @param id
     * @param bookId
     * @return
     */
    boolean UpdateSubscribeState(Integer id, Integer bookId);

    /**
     * 修改用户基本信息
     * @param id
     * @param path
     * @param nickName
     * @param code
     */
    void updateUserInfoById(Integer id, String path, String nickName, String email, String code);

    /**
     * 点赞/点踩 或者取消
     * @param UserId
     * @param id
     * @param actionType
     */
    ChapterSays giveTheThumbsUp(Integer UserId, Long id, String actionType, ActionType oldType);

    /**
     *
     * 查询用户的页面
     */
    UserInquireVo userInquire(Integer id);

    /**
     * 查询用户和书籍的相关信息
     * @param bookId
     * @param id
     * @return
     */
    SimpleBookRackVo selectBookRackByUserIdAndBookId(Integer bookId, Integer id);

    /**
     * 查询用户书架的分组
     * @param userId
     * @return
     */
    List<String> selectGroup(Integer userId);

    /**
     * 发送更换密码验证码
     * @param email
     *
     */
    void replaceMailbox(String email,Integer userId);

    /**
     * 逻辑删除
     * @param id
     * @param bookIdList
     */
    void logicalDeletion(Integer id, List<Integer> bookIdList);

    ChapterSays insterChaterSays(ChapterSays chapterSays);

    /***
     * 保存浏览记录
     * @param browsing
     */
    void Savethebrowse(Browsing browsing,Integer bookId);

    /**
     * 根据用户的id和书籍的id进行查询章节的id从而得到章节顺序
     * @param bookId
     * @param id
     */
   Integer selectChapters(Integer bookId, Integer id);
}
